#ifndef SPREADSHEETWINDOW_H
#define SPREADSHEETWINDOW_H

// 主窗口类管理和协调模型与视图
// 创建并管理所有子组件
// 连接核心组件信号槽
#include <QMainWindow>
#include "spreadsheetmodel.h"
#include <QSettings>
#include <QStandardPaths>
#include <QDir>
#include <QUndoStack>
#include <QUndoView>
#include <QInputDialog>
#include <QFileDialog>
#include <QMessageBox>
#include <QCloseEvent>
#include <QFileInfo>
#include <windows.h>
#include <shlobj.h>  // 包含 SHChangeNotify 的声明
#include <QDebug>
#include <QApplication>
#include <QClipboard>    // 剪贴板操作
#include <QMimeData>     // 用于存储多种格式的数据
#include <QTextBrowser>

namespace Ui {
class SpreadSheetWindow;  // 与.ui文件中的类名一致
}
class SpreadsheetWindow : public QMainWindow
{
    Q_OBJECT
public:
    //初始化
    explicit SpreadsheetWindow(QWidget *parent = nullptr);
    ~SpreadsheetWindow();

private slots:
    //槽函数
    /*UI交互*/
    void showContextMenu(const QPoint &pos);//右键显示菜单
    void aboutSpreadSheet();//关于软件说明

    /*行列扩展*/
    void addNewRow(); //添加新行
    void addNewCol(); //添加新列

    /*文件管理*/
    void newFile();       // 新建文件
    void openFile();      // 打开文件
    void saveFile();      // 保存文件
    void saveAsFile();    // 另存为文件
    bool maybeSave();     // 检查是否需要保存

    /*复制粘贴剪切*/
    void copySelection(); // 复制选中区域
    void pasteToSelection(); // 粘贴到选中区域
    void cutSelection();  // 剪切选中区域
    void updateCopyBufferFromClipboard();  // 剪贴板更新时的槽函数
    void pasteReplace();    // 代替粘贴
    void pasteAdd();        // 相加粘贴
    void pasteSubtract();   // 相减粘贴
    void pasteReplaceWhenGreater(); // 粘贴大于原数时替换
    void pasteReplaceWhenLess();    // 粘贴小于原数时替换

    /*插入删除行列*/
    void insertRow();//插入行
    void insertCol();//插入列
    void deleteRow();//删除行
    void deleteCol();//删除列
    void clearContents();//清除内容

    /*排序*/
    void sortCurrentColumnAscending();//按列升序
    void sortCurrentColumnDescending();//按列降序
    void sortCurrentRowAscending();//按行升序
    void sortCurrentRowDescending();//按行降序
    void toggleCaseSensitiveSort(bool enabled);//设置排序是否大小写敏感

    /*统计计算*/
    void calculateSum();       // 合计
    void calculateAverage();   // 平均
    void calculateMax();       // 最大值
    void calculateMin();       // 最小值

    /*公式计算*/
    void showStatisticsResult(const QString& result); // 显示结果到编辑栏
    void updateLineEditFromSelection();  // 当选择变化时更新编辑栏
    void updateCellFromLineEdit();       // 当编辑栏内容变化时更新单元格
    void updateIndexLabel();//显示选择的单元格索引项
    void insertSumFormula();//选择SUM函数
    void insertAverageFormula();//选择AVERAGE函数
    void insertMaxFormula();//选择MAX函数
    void insertMinFormula();//选择MIN函数
    void TypeFormula();//键入公式

protected:
    //重写函数
    void closeEvent(QCloseEvent *event) override;// 关闭事件

private:
    //辅助成员
    /*初始化方法*/
    void initUI();          // 初始化界面组件
    void initConnections(); // 连接信号槽

    /*文件*/
    void loadFile(const QString &fileName);//加载文件
    bool saveToFile(const QString &fileName);//实际保存文件
    void setStatus();//设置状态栏信息
    void setCurrentFile(const QString &fileName); // 设置当前文件并更新最近文件
    bool registerFileAssociation();//修改sheet文件的图标
    QString extractIconToTemp();//提取 .ico 文件到临时目录

    /*条件粘贴*/
    void createPasteOptionMenu(); // 创建粘贴选项菜单
    void createConditionalReplaceMenu(); // 创建按条件替换子菜单
    void pasteWithOption(QAction* action); // 处理带选项的粘贴
    void pasteConditionalReplace(); // 按条件替换粘贴

    /*统计计算*/
    QString calculateSelection(SpreadsheetModel::StatType type); // 统计计算核心方法

    //成员变量
    Ui::SpreadSheetWindow *ui;       // 必须与.ui文件中的类名一致
    SpreadsheetModel*spreadsheetmodel;//模型对象
    QString currentFile;  // 当前打开的文件路径
    QSettings settings;//配置文件
    QVector<QVector<QVariant>> copyBuffer; // 复制缓冲区
    QPoint bufferTopLeft; // 复制区域的左上角坐标
    QClipboard *clipboard; // 剪贴板对象指针
    QMenu* pasteOptionMenu; // 粘贴选项菜单
    QString customReplaceCondition; // 自定义替换条件
    QMenu* conditionalReplaceMenu; // 按条件替换子菜单

};
#endif // SPREADSHEETWINDOW_H
